//  addTask(1000,"1");
//  addTask(500,"2");
//  addTask(300,"3");
//  addTask(400,"4");
//  的输出顺序是：2 3 1 4

//  整个的完整执行流程：

// 一开始1、2两个任务开始执行
// 500ms时，2任务执行完毕，输出2，任务3开始执行
// 800ms时，3任务执行完毕，输出3，任务4开始执行
// 1000ms时，1任务执行完毕，输出1，此时只剩下4任务在执行
// 1200ms时，4任务执行完毕，输出4

class Scheduler {
    constructor(limit){
        this.queue = [];
        this.maxCount = limit;
        this.runCounts = 0;
    }

    add(time, order){
        const promiesCreater = () => {
            return new Promise((resolve, reject) =>{
                setTimeout(()=>{
                    resolve()
                }, time)
            }).then(()=>{
                console.log(order);
            });
        };
        this.queue.push(promiesCreater);
    }

    taskStart() {
        for(let i = 0; i<this.maxCount; i++){
            this.runQuest();
        }
    }

    runQuest() {
        if(!this.queue.length || this.runCounts >=this.maxCount) {
            return;
        }
        this.runCounts++;
        this.queue.shift()().then(()=>{
            this.runCounts--;
            this.runQuest();
        })
    }
}

const scheduler = new Scheduler(2);
const addTask = (time, order) => {
  scheduler.add(time, order);
};
addTask(1000, "1");
addTask(500, "2");
addTask(300, "3");
addTask(400, "4");
scheduler.taskStart();


// 版本2：
class Scheduler1 {
    constructor(){
        this.queue = [];
        this.maxCount = 2;
        this.runCounts = 0;
    }

    add(promiesCreater){
        this.queue.push(promiesCreater);
    }

    taskStart() {
        for(let i = 0; i<this.maxCount; i++){
            this.runQuest();
        }
    }

    runQuest() {
        if(!this.queue.length || this.runCounts >=this.maxCount) {
            return;
        }
        this.runCounts++;
        this.queue.shift()().then(()=>{
            this.runCounts--;
            this.runQuest();
        })
    }
}

// const scheduler1 = new Scheduler1()


// function timeout(time){
//     return new Promise(resolve=>{
//         setTimeout(resolve,time)
//     })
// }

// function addTask(time, order){
//     // scheduler1.add(()=>timeout(time).then(()=>console.log(order)))
//     scheduler1.add(
//         () => {
//             return new Promise(resolve=>{
//                 setTimeout(resolve,time)
//             }).then(()=>{
//                 console.log(order)
//             })
//         }
//     );
// }

// addTask(1000,1)
// addTask(500,2)
// addTask(300,3)
// addTask(400,4)

// scheduler1.taskStart()